package com.yztctech.a14_02_contentresolver_contact;

import android.content.ContentResolver;
import android.database.Cursor;
import android.provider.ContactsContract;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

/**
 * 获取当前手机的联系人的ContentSolver
 * 备注:
 * 1. listview 简易demo
 * 2. Android6需要动态申请权限(本demo没有写)
 * 3. ContentSolver除了可以获取联系人,还可以获取什么?是不是只要是手机本地表都可以获取呢?
 * 4. 这里要引用一个SQLite数据库的概念,两者有什么区别?
 * */
public class MainActivity extends AppCompatActivity {

    /**三张表Android手机系统的,为了信息安全,如果有一张表丢失了,不会连累其他的表,但是很鸡肋.没什么大的用处
     ContactsContract.Contacts.CONTENT_URI 管理联系人（如姓名）					//联系人表
     ContactsContract.CommonDataKinds.Phone.CONTENT_URI 管理联系人的电话		//电话表
     ContactsContract.CommonDataKinds.Email.CONTENT_URI 管理联系人的Email		//email表
     */

    /**
     联系人_id字段名称为：ContactsContract.Contacts._ID         -"_id"
     联系人name 字段为：ContactsContract.Contacts.DISPLAY_NAME  -"display_name"

     电话号码字段为：ContactsContract.CommonDataKinds.Phone.NUMBER. -"phone"
     电话信息表的外键id为：ContactsContract.CommonDataKinds.Phone.CONTACT_ID - "contact_id"

     Email字段为：ContactsContract.CommonDataKinds.Email.DATA   -"data1"
     其外键为：ContactsContract.CommonDataKinds.Email.CONTACT_ID -"contact_id"

     */

    private List<ContactInfo> contacts;//联系人listview的数据源
    private ContactAdapter contactAdapter;//联系人适配器
    private ListView contactListView;//listview

    private ContentResolver contentResolver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initData();//初始化数据 数据源 1,查询系统内联系人的各个表名,字段名,外键名如上 2,使用contentresolver查询系统的各表数据属性放到javabean对象数性 并加到list集合中	3,将得到的list数据 和自定义的listview绑定
        initView();//初始化view 包括适配器初始化, listview初始化 ,绑定适配器,监听
    }

    /**
     * 备注:
     * 1. 可以通过_id,name,phone,email 着手,通过_id获取,这些是数据源想要的东西
     * 2. 再看contactCusor,phoneCursor,emailCursor ,通过不同的Uri获取三个cusor,最后记得close
     * 3. 最后看contentResolver
     * */
    private void initData() {//数据源比较麻烦 设计到多表查询 
        //获得手机系统的联系人
        contentResolver = getContentResolver();
        contacts = new ArrayList<>();
        //查询Contacts表-------->系统的联系人列表/////反复的cursor是一个集合
        Cursor contactCusor = contentResolver.query(
                ContactsContract.Contacts.CONTENT_URI, null, null, null, null);//参数一 是表名,把姓名表的所有数据都取回,在进行遍历
        while (contactCusor.moveToNext()) {
            //先获得_id------>这个ID在是另外两个表的外键 需要使用
            int _id = contactCusor.getInt(contactCusor.getColumnIndex(ContactsContract.Contacts._ID));

            //再获得display_name;联系人姓名
            String name = contactCusor.getString(contactCusor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME ));
            ContactInfo contact = new ContactInfo();//设置javabean对象属性值 虽然表多,但是可以使用多表查询得到的数据 放在同一个javabean中,然后add到list集合中
            contact.setName(name);

            //查询_id对应的Phone表
            Cursor phoneCursor = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, //参数一 管理联系人的电话的表名
					null,													 //参数二	字段名
                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=?",// 参数三 条件 
                    new String[]{String.valueOf(_id)},						 //参数四 条件值
					null);													 //
            if (phoneCursor.moveToNext()) {
                String phone = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                contact.setPhone(phone);//设置javabean对象属性值 
            }
            phoneCursor.close();//----------关闭cursor

            //查询_id对应的email表
            Cursor emailCursor = contentResolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null,
                    ContactsContract.CommonDataKinds.Email.CONTACT_ID + "=?",
                    new String[]{String.valueOf(_id)},null);
            if (emailCursor.moveToNext()) {
                String email = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
                contact.setEmail(email);//设置javabean对象属性值
            }
            emailCursor.close();//关闭cursor
            contacts.add(contact);

        }

        //关闭Cursor
        contactCusor.close();//-------------关闭cursor

    }

    private void initView() {
        contactAdapter = new ContactAdapter();
        contactListView = (ListView) findViewById(R.id.lv_contact);
        contactListView.setAdapter(contactAdapter);
    }

    class ContactAdapter extends BaseAdapter{

        @Override
        public int getCount() {
            return contacts.size();
        }

        @Override
        public Object getItem(int i) {
            return contacts.get(i);
        }

        @Override
        public long getItemId(int i) {
            return i;
        }

        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {

            ViewHolder vh = null;
            if (view == null) {
                view = getLayoutInflater().inflate(R.layout.item_contact, viewGroup, false);
                vh = new ViewHolder();
                vh.nameTv = (TextView) view.findViewById(R.id.tv_name);
                vh.phoneTv = (TextView) view.findViewById(R.id.tv_phone);
                vh.emailTv = (TextView) view.findViewById(R.id.tv_email);
                view.setTag(vh);
            } else {
                vh = (ViewHolder) view.getTag();
            }

            //关联数据
            ContactInfo contact = contacts.get(i);
            vh.nameTv.setText(contact.getName());
            vh.phoneTv.setText(contact.getPhone());
            vh.emailTv.setText(contact.getEmail());

            return view;
        }

        class ViewHolder{
            TextView nameTv, phoneTv, emailTv;
        }
    }


}
